package com.pacvue.anno;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.pacvue.handler.DefaultLockFailureHandler;
import com.pacvue.handler.LockFailureHandler;

/**
 * Redisson分布式锁注解
 * 
 * @author pacvue
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedissonLock {

    /**
     * 锁键（支持 SpEL 表达式）
     * 例如：#user.id, #order.orderNo, 'user:lock:' + #userId
     */
    String key();

    /**
     * 尝试获取锁等待时间（秒）
     * 默认60秒
     */
    long waitTime() default 60L;

    /**
     * 锁自动释放时间（秒）
     * 默认10秒
     */
    long leaseTime() default 10L;

    /**
     * 是否启用看门狗自动续期
     * 默认不启用，启用看门狗后会一直续期直到锁被线程释放
     */
    boolean enableWatchdog() default false;

    /**
     * 锁类型
     * 默认可重入锁
     */
    LockType lockType() default LockType.REENTRANT;

    /**
     * 获取锁失败时的异常处理策略
     * 默认抛出异常
     */
    Class<? extends LockFailureHandler> failHandler() default DefaultLockFailureHandler.class;

    /**
     * 锁类型枚举
     */
    enum LockType {
        /**
         * 可重入锁（默认）
         */
        REENTRANT,
        /**
         * 公平锁
         */
        FAIR,
        /**
         * 读锁
         */
        READ,
        /**
         * 写锁
         */
        WRITE
    }

}
